package org.rkuk.kasutil.media 
{
	import flash.events.EventDispatcher;
	import org.rkuk.kasutil.designPatternTools.AbstractTool;
	
	/**
	 * ...
	 * @author rkuk
	 */
	internal class MediaState extends EventDispatcher 
	{
		//protected var pendingLevel:int;
		protected var media:MediaProxy;
		
		/**
		 * 
		 * @param	media			被赋予状态的MediaProxy
		 * @param	pendingLevel	当前状态正在执行可能引起状态变更的操作的优先级
		 * 							优先级越高，则在该操作执行之前，不能执行优先级低的操作
		 * 							0表示没有正在执行的操作
		 */
		public function MediaState(media:MediaProxy) 
		{
			AbstractTool.makeAbstractClass(this, MediaState);
			this.media = media;
			//pendingLevel = 0;
		}
		
		/**
		 * MediaSource进入当前状态时，所对应发出事件的类型
		 * 子类中override该方法返回状态所对应的事件类型
		 */
		public function get description():String
		{
			return AbstractTool.makeAbstractMethod(this, "description");
		}
		
		/**
		 * 废弃当前MediaState对象
		 */
		public function dispose():void
		{
			//removeMediaProxyListener();
			media = null;
		}
		
		/**
		 * 根据当前状态，让Media播放
		 */
		public function start(...rest):void
		{
			//不标记abstract，而是留空，避免子类中必须override
		}
		
		/**
		 * 根据当前状态，让Media停止
		 */
		public function stop():void
		{
			//不标记abstract，而是留空，避免子类中必须override
		}
		
		/**
		 * 根据当前状态，让Media继续播放
		 */
		public function resume():void
		{
			//不标记abstract，而是留空，避免子类中必须override
		}
		
		/**
		 * 根据当前状态，让Media暂停
		 */
		public function pause():void
		{
			//不标记abstract，而是留空，避免子类中必须override
		}
		
		/**
		 * 根据当前状态，让Media跳至指定时间播放
		 */
		public function seek(offset:Number):void
		{
			//不标记abstract，而是留空，避免子类中必须override
		}
		
		/**
		 * 重新设置Media的数据来源
		 */
		public function reset():void
		{
			AbstractTool.makeAbstractMethod(this, "reset");
		}
	}
}